package org.project.d.network.handler;

import com.google.common.cache.RemovalListener;
import lombok.Builder;
import lombok.Data;
import org.project.d.network.Connection;
import org.project.d.network.msg.enums.Protocol;

import java.util.concurrent.TimeUnit;

/**
 * @author lin
 * @version V1.0
 * @description
 * @date 2020/7/27 3:02 下午
 */
@Data
@Builder
public class ConnectionEvent {
    /**
     * 缓存的链接（{@link Connection}）改变后会触发该函数
     * key= ip:port v={@link Connection}
     * */
    @Builder.Default
    private RemovalListener<String, Connection> removalListener=(s)->{};


    @Builder.Default
    private boolean removalListenerSync=false;
    /**
     * tcp 心跳通知事件 udp设置后也不生效
     * udp 心跳事件通过 removalListener 实现 udp底层是使用的cache缓存链接，udp实际却并不是一个链接，所以需要特殊处理，在netty中udp的channel至始至终只有一个，而tcp的服务器channel一个链接就会创建一个channel
     * */
    private HeartEvent heartEvent;

    @Builder.Default
    private boolean heartEventSync=false;
    /**
     * 标示用于什么链接，可以不填
     * */
    @Builder.Default
    private Protocol protocol=Protocol.TCP_AND_UDP;
    /**
     * udp的过期时间，到了过期时间后，会清除该链接（{@link Connection}）
     * key= ip:port v={@link Connection}
     * */
    @Builder.Default
    private long udpExpireDuration=Long.parseLong((System.getProperty("project.d.udpExpireDuration","30")));
    /**
     * udp的过期时间，到了过期时间后，会清除该链接（{@link Connection}）
     * key= ip:port v={@link Connection}
     * */
    @Builder.Default
    private TimeUnit udpExpireUnit=TimeUnit.SECONDS;
    /**
     * 是否使用内置的定时任务线程池，对udp进行cleanUp，因为UDP用的是LFU算法，所以需要定时cleanUp
     * 如果不实用内置的定时任务线程池，请使用netty的IdleStateHandler 可以减少cleanUp的次数
     * */
    @Builder.Default
    private boolean useBuiltInTimingThreadPool=true;
}
